一.Junit单元测试
  a.概述
   Junit是一种Java写的单元测试框架,专门用来测试java程序,它可以取代main方法
  b.Junit环境搭建
    由于Junit使用的类不属于我们JDK的类库,需要引入第三方jar包,才能使用
  c.Junit使用
		/**
		 * Junit单元测试使用
		 * 我们测试方法只需要在方法上添加一个注解 @Test
		 * 1.我们在不同的方法上加上@Test,每个方法都可以独立运行
		 * 2.如果在类上运行,那么会测试该类的所有方法,如果有一个方法测试失败,那么该类就测试失败
		 * 各个方法独立测试,相互之间不干扰
		 */
  d.Junit注意事项
	/**
	 * Junit注意事项:
	 * @Test 只能用在基于以下模板定义的方法
	 *  public void 方法名(){
	 *
	 *  }
	 *  1.权限修饰符必须是public
	 *  2.返回值类型必须为void
	 *  3.形参列表必须为空
	 *  4.该方法不能是静态方法
	 */
	/**
	 * 调用非public void method(){}的方法
	 *  解决方案:
	 *    先定义一个可以使用@Test注解方法,然后去调用不能使用@Test注解方法来达到测试目的
	 */
二.反射
  a.字节码对象
    当JVM用到一个类的时候,会把这个类加载到内存中,首先在方法区存放类的定义信息
    还要在堆内存中创建一个字节码对象和类文件(字节码文件)一一对应
  b.Class类
     参见图解
  c.反射(reflect)概述
    反射其实就是解剖一个类,获取类中的各项信息(构造方法,成员变量,成员方法)
     类比:
       法医解剖人的尸体,人体内又很多器官(心肝脾肺肾),法医获取这些器官
       程序员解剖一个类,类种有构造方法信息,成员变量信息,成员方法信息,程序员获取这些信息
  d.获取字节码对象的三种方式
	/**
	 * 反射的第一步获取字节码对象,因为只有获取到字节码对象,才能进一步获取类中的信息
	 * 三种方式:
	 *   1.类名.class 代表一个字节码对象
	 *   2.通过Class类的方法,所有的字节码对象都是Class类的实例
	 *     static Class<?> forName(String className)
	 *           返回与带有给定字符串名的类或接口相关联的 Class 对象。
	 *   3.通过Object类中的getClass()方法获取该类的字节码对象
	 *      Class<?> getClass()
	 *           返回此 Object 的运行时类。
	 *   无论采用哪种方式获取该类的字节码对象,都是获取的同一个字节码对象
	 */
  e.反射构造方法
	/**
	 * 反射(解剖出)构造方法
	 * Class<T>:T代表字节码对象所表示的类
	 * 基本的 Java 类型（boolean、byte、char、short、int、long、float 和 double）和关键字 void 也表示为 Class 对象。
	 * 只需要将基本类型后面带上.class就表示Class的实例
	 * Class类中成员方法:
	 *   Constructor<T> getConstructor(Class<?>... parameterTypes)
	 *           返回一个 Constructor 对象，它反映此 Class 对象所表示的类的指定公有(public)构造方法。
	 *           <T>:表示当前字节码对象代表的类
	 *
	 *   Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
	 *           获取类中声明的任意一个构造方法
	 *
	 *    T newInstance()
	 *           只能利用该类的空参构造创建对象,不能利用有参构造创建对象
	 *
	 * Constructor类中的方法
	 *   String getName()
	 *           以字符串形式返回此构造方法的名称。
	 *   T newInstance(Object... initargs)
	 *           使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例，并用指定的初始化参数初始化该实例
	 */
  f.反射成员变量(字段)

	/**
	 * 反射(解剖出)字段
	 * Class类中的成员方法:
	 *    Field getField(String name)
	 *           返回一个 Field 对象，它反映此 Class 对象所表示的类或接口的指定public修饰的成员字段。
	 *     Field getDeclaredField(String name)
	 *           返回一个 Field 对象，该对象反映此 Class 对象所表示的类或接口的指定已声明字段
	 * Field类中的成员方法:
	 *  Object get(Object obj)
	 *           返回指定对象上此 Field 表示的字段的值。
	 */
  g.反射成员方法
	/**
	 * 反射(解剖出)成员方法信息
	 * Class类中的成员方法:
	 *  Method getMethod(String name, Class<?>... parameterTypes)
	 *           返回一个 Method 对象，它反映此 Class 对象所表示的类或接口的指定公共成员方法。
	 * Method类的方法:
	 *  Object invoke(Object obj, Object... args)
	 *        形参:
	 *          Object obj:代表该类的一个对象
	 *          args:代表传递给方法的实参
	 *        返回值:
	 *          代表调用的方法的返回值
	 *          如果该方法没有返回值,那么invoke返回null
	 */
三.枚举
  a.枚举概述
    一一列举
    如果某些变量的取值是固定几个值中其中一个,我们就考虑定义枚举
    星期(一~日) 月份(1~12月)  性别(男,女)
  b.模拟java中的枚举
	public class Week {

		/**
		 * 私有化构造方法目的:只能使用Week类中的这七个对象
		 * 而不能在类外再创建该类的对象
		 */
		private Week() {

		}

		private String weekName;//代表星期的名称

		private Week(String weekName) {
			this.weekName = weekName;
		}

		/**
		 * public:保证权限足够大,在类外以及不同的包下都能访问
		 * static:不需要在类外创建对象,可以通过类名直接调用
		 * final:final修饰变量,该变量只能被赋值一次,该变量就成为常量
		 * 常量的命名规范,变量名纯大写 XXX_XXX_XXX
		 */
		/*public static final Week MONDAY = new Week();
		public static final Week TUESDAY = new Week();
		public static final Week WEDNESDAY = new Week();
		public static final Week THURSDAY = new Week();
		public static final Week FRIDAY = new Week();
		public static final Week SATURDAY = new Week();
		public static final Week SUNDAY = new Week();*/

		public static final Week MONDAY = new Week("星期一");
		public static final Week TUESDAY = new Week("星期二");
		public static final Week WEDNESDAY = new Week("星期三");
		public static final Week THURSDAY = new Week("星期四");
		public static final Week FRIDAY = new Week("星期五");
		public static final Week SATURDAY = new Week("星期六");
		public static final Week SUNDAY = new Week("星期日");

		@Override
		public String toString() {
			//return "星期一";
			return weekName;
		}
	}
  c.利用enum创建枚举
		/**
		 * java中利用enum关键字定义枚举
		 * 格式:
		 *  权限修饰符 enum 枚举名称{
		 *      枚举常量1,枚举常量2,枚举常量3,...;
		 *  }
		 *  Java中利用enum定义的枚举的原理和我们自己模拟的枚举原理相同
		 *
		 *  MONDAY("星期一")相当于:public static final Week MONDAY = new Week("星期一");
		 */
		public enum Week {
			MONDAY("星期一"),TUESDAY("星期二"),
			WEDNESDAY("星期三"),THURSDAY("星期四"),
			FRIDAY("星期五"),SATURDAY("星期六"),SUNDAY("星期日");

			private String weekName;//定义一个接收星期名称的成员变量

			private Week(String weekName) {
				this.weekName = weekName;
			}

			private Week() {

			}
			@Override
			public String toString() {
				return weekName;
			}

		}
  d.枚举中的常用方法
	/**
	 *
	 * Java中所有用enum定义的枚举默认会继承一个类:java.lang.Enum
	 * Class类中的方法:
	 *   Class<? super T> getSuperclass()
	 *          获取该字节对象的父字节码对象
	 *    Method[] getMethods()
	 *         获取该字节码对象中所有public修饰的成员方法
	 *
	 * 枚举中的常用方法:
	 *   public static Week[] values()
	 *      获取所有的枚举常量,并把所有的枚举常量封装到一个数组返回
	 *   public static Week valueOf(String str)
	 *   public final String name()返回此枚举常量的名称，在其枚举声明中对其进行声明
	 */